/*
题目描述：1 ~ n 整数中1 出现的次数
方法：
设定整数点(1, 10, 100等)为 i，分别对每一个数位进行分析
 */
public class E43 {
    public static void main(String[] args) {
        int n = 1314;
        int res  = NumberOf1Between1AndN_Solution(n);
        System.out.println(res);
    }

    public static int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;
        for(int i = 1; i <= n; i *= 10){
            int a = n/i;
            int b = n%i;
            count += (a + 8)/ 10 *  i + (a % 10 == 1 ? 1 : 0)*(b + 1);
            //之所以补8，是因为当百位为0，则a/10==(a+8)/10，当百位>=2，补8会产生进位位，效果等同于(a/10+1)
            /**
             * 以 1314 为例
             * 当分析百位，i = 100， a = 13, b = 14, count += (13 + 8) / 10 * 100, 也就是百位上为 1 的情况下， 一共有200个 1100 ~1199, 100 ~ 199
             *
             * 以1114 为例
             * 当分析百位时，i = 100， a = 11， b = 14， count += (11 + 8) / 10 * 100 + (14 + 1),一共有115个， 1100~1114, 100 ~ 199
             *
             * 以1014为例
             * 分析百位时， i = 100， a = 10, b = 14, count += (10 + 8) / 10 * 100 ，一共有100个，100~199
             */
        }
        return count;
    }
}
/*
782
 */